#include "map.h"
#include <graphics.h>
#include <stdlib.h>

// 地图初始数据
int map_data[MAP_ROWS][MAP_COLS] = {
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,2,2,2,1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,1},
    {1,2,1,2,1,2,1,1,1,1,1,1,1,2,1,2,1,2,2,1},
    {1,2,1,2,2,2,2,2,1,2,2,2,1,2,2,2,1,2,2,1},
    {1,2,1,1,1,1,1,2,1,1,1,2,1,1,1,1,1,2,2,1},
    {1,2,2,2,2,2,1,2,2,2,2,2,1,2,2,2,2,2,2,1},
    {1,2,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,2,2,1},
    {1,2,2,2,1,2,2,2,1,2,1,2,2,2,1,2,2,2,2,1},
    {1,1,1,2,1,1,1,2,1,2,1,2,1,1,1,2,1,1,1,1},
    {1,2,2,2,2,2,2,2,0,0,0,0,2,2,2,2,2,2,2,1},
    {1,2,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,2,1},
    {1,2,2,2,2,2,2,2,1,0,0,1,2,2,2,2,2,2,2,1},
    {1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,1},
    {1,2,2,2,1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,1},
    {1,2,1,2,1,2,1,1,1,1,1,1,1,2,1,2,1,2,2,1},
    {1,2,1,2,2,2,2,2,1,2,2,2,1,2,2,2,1,2,2,1},
    {1,2,1,1,1,1,1,2,1,1,1,2,1,1,1,1,1,2,2,1},
    {1,2,2,2,2,2,1,2,2,2,2,2,1,2,2,2,2,2,2,1},
    {1,2,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,2,2,1},
    {1,2,2,2,1,2,2,2,1,2,1,2,2,2,1,2,2,2,2,1},
    {1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};

// 检查某个位置是否是墙
int is_wall(int row, int col) {
    // 检查边界
    if (row < 0 || row >= MAP_ROWS || col < 0 || col >= MAP_COLS)
        return 1;  // 把边界当作墙
    return map_data[row][col] == 1;
}

void map_init(Map* map) {
    // 复制地图数据
    for (int i = 0; i < MAP_ROWS; ++i)
        for (int j = 0; j < MAP_COLS; ++j)
            map->grid[i][j] = map_data[i][j];
    
    // 构建豆子链表
    map->dotHead = NULL;
    Dot* tail = NULL;
    for (int i = 0; i < MAP_ROWS; ++i) {
        for (int j = 0; j < MAP_COLS; ++j) {
            if (map->grid[i][j] == 2) {
                Dot* dot = (Dot*)malloc(sizeof(Dot));
                dot->row = i;
                dot->col = j;
                dot->next = NULL;
                if (map->dotHead == NULL) {
                    map->dotHead = dot;
                    tail = dot;
                } else {
                    tail->next = dot;
                    tail = dot;
                }
            }
        }
    }
}

void map_draw(Map* map) {
    // 画墙和路径
    for (int i = 0; i < MAP_ROWS; ++i) {
        for (int j = 0; j < MAP_COLS; ++j) {
            int x = j * TILE_SIZE;
            int y = i * TILE_SIZE;
            if (map->grid[i][j] == 1) {
                // 画墙（黑色）
                setfillcolor(BLACK);
                solidrectangle(x, y, x + TILE_SIZE, y + TILE_SIZE);
            }
            // 路径不需要绘制，因为已经有蓝色背景
        }
    }
    
    // 画豆子（白色，更小的圆点）
    Dot* cur = map->dotHead;
    while (cur) {
        int x = cur->col * TILE_SIZE + TILE_SIZE/2;
        int y = cur->row * TILE_SIZE + TILE_SIZE/2;
        setfillcolor(WHITE);
        solidcircle(x, y, TILE_SIZE/8);  // 使豆子更小一些
        cur = cur->next;
    }
}

int map_eat_dot(Map* map, int row, int col) {
    if (row < 0 || row >= MAP_ROWS || col < 0 || col >= MAP_COLS) 
        return 0;
        
    Dot* prev = NULL;
    Dot* cur = map->dotHead;
    while (cur) {
        if (cur->row == row && cur->col == col) {
            if (prev) prev->next = cur->next;
            else map->dotHead = cur->next;
            free(cur);
            map->grid[row][col] = 0;  // 更新地图数据
            return 1;
        }
        prev = cur;
        cur = cur->next;
    }
    return 0;
}

void map_free_dots(Map* map) {
    Dot* cur = map->dotHead;
    while (cur) {
        Dot* next = cur->next;
        free(cur);
        cur = next;
    }
    map->dotHead = NULL;
}